package com.wx.mall.goods.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.wx.mall.common.api.CommonPage;
import com.wx.mall.common.api.PageVo;
import com.wx.mall.common.exceptions.ApiException;
import com.wx.mall.common.utils.UploadUtil;
import com.wx.mall.common.vo.goods.SkuVo;
import com.wx.mall.goods.entity.Sku;
import com.wx.mall.goods.entity.Spec;
import com.wx.mall.goods.mapper.SkuMapper;
import com.wx.mall.goods.service.ISkuService;
import com.wx.mall.goods.vo.req.SkuMatchVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author ljl
 * @since 2020-04-16
 */
@Service
public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuService {
    /**
     * 文件上传路径
     */
    @Value("${localhost.file.path}")
    private String filePath;
    @Autowired
    private UploadUtil uploadUtil;

    @Override
    public CommonPage<SkuVo> pageList(PageVo vo) {
        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
        QueryWrapper<Sku> wrapper = new QueryWrapper<>();
        // 按id倒序查询
        wrapper.orderByDesc("id");
        return parsePageList(wrapper);
    }

    @Override
    public CommonPage<SkuVo> pageListBySpuId(PageVo vo, Integer id) {
        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
        QueryWrapper<Sku> wrapper = new QueryWrapper<>();
        wrapper.eq("spu_id", id);
        // 按id倒序查询
        wrapper.orderByDesc("id");
        return parsePageList(wrapper);
    }

    @Override
    public List<SkuVo> listBySpuId(Integer id) {
        QueryWrapper<Sku> wrapper = new QueryWrapper<>();
        wrapper.eq("spu_id", id);
        // 按id倒序查询
        wrapper.orderByDesc("id");
        return parseSkuList(this.list(wrapper));
    }

    @Override
    public CommonPage<SkuVo> pageMatch(SkuMatchVo vo) {
        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
        QueryWrapper<Sku> wrapper = new QueryWrapper<>();
        // 按SKU编码模糊查询
        wrapper.like("encode", vo.getMatch());
        return parsePageList(wrapper);
    }

    @Override
    public List<SkuVo> selectMatch(String encode) {
        QueryWrapper<Sku> wrapper = new QueryWrapper<>();
        if (encode != null && !"".equals(encode)) {// 新增的数据encode 为 null 无法模糊匹配空字符串 需排除
            // 按SKU编码模糊查询
            wrapper.like("encode", encode);
        }
        return parseSkuList(this.list(wrapper));
    }

    @Override
    public void insertEntity(SkuVo vo) {
        QueryWrapper<Sku> wrapper = new QueryWrapper<>();
        String nameSpace = vo.getSpuId() + vo.getSpec();
        UUID uuid = UUID.nameUUIDFromBytes(nameSpace.getBytes());
        // 商品SKU UUID
        wrapper.eq("uuid", uuid.toString());

//        List<Sku> skuList = this.list(wrapper);
//        int index = 0;
//        for (Sku sku : skuList) {
//            if (sku.getSpec().equals(vo.getSpec())) {
//                break;
//            } else {
//                index++;
//            }
//        }
//        if (skuList.size() == index) {
//            Sku sku = new Sku();
//            //将Sku实体中的数据复制到SkuVo中
//            BeanUtils.copyProperties(vo, sku);
//            boolean save = this.save(sku);
//            if (!save) {
//                throw new ApiException("添加商品SKU失败。");
//            }
//        }
        if (this.getOne(wrapper) == null) {
            Sku sku = new Sku();
            //将Sku实体中的数据复制到SkuVo中
            BeanUtils.copyProperties(vo, sku);
            sku.setUuid(uuid.toString());
            boolean save = this.save(sku);
            if (!save) {
                throw new ApiException("添加商品SKU失败。");
            }
        }
    }

    @Override
    public void deleteEntity(Integer id) {
        // 根据ID获取SKU对象
        Sku sku = this.getById(id);
        if (sku != null && sku.getImages() != null) {
            // 获取图片列表
            String images = sku.getImages();
            // 解析图片对象列表
            JSONArray jsons = JSON.parseArray(images);
            // 遍历图片对象
            for (int i = 0; i < jsons.size(); i++) {
                //获取图片对象
                JSONObject object = jsons.getJSONObject(i);
                // 获取对象的URL
                String url = object.getString("url");
                // 拆分并获取图片名
                String[] str = url.split("/upload/");
                uploadUtil.remove(filePath, str[str.length - 1]);
            }
        }
        boolean remove = this.removeById(id);
        if (!remove) {
            throw new ApiException("删除商品SKU失败。");
        }
    }

    @Override
    public SkuVo selectEntity(Integer id) {
        Sku sku = this.getById(id);
        SkuVo vo = new SkuVo();
        //将Sku实体中的数据复制到SkuVo中
        BeanUtils.copyProperties(sku, vo);
        return vo;
    }

    @Override
    public Boolean updateEntity(SkuVo vo) {
        Sku sku = new Sku();
        //将Sku实体中的数据复制到SkuVo中
        BeanUtils.copyProperties(vo, sku);

        boolean update = this.updateById(sku);
        if (!update) {
            throw new ApiException("更新商品SKU失败。");
        }
        return true;
    }

    @Override
    public Map<String, String> uploadImage(MultipartFile file, String name) {
        return uploadUtil.uploadUUID(file, filePath, name);
    }

    @Override
    public Boolean deleteImage(String fileName) {
        return uploadUtil.remove(filePath, fileName, UploadUtil.Encode.UUID);
    }

    private CommonPage<SkuVo> parsePageList(QueryWrapper<Sku> wrapper) {
        CommonPage<Sku> page = CommonPage.restPage(this.list(wrapper));
        CommonPage<SkuVo> result = CommonPage.restPage(parseSkuList(page.getList()));
        result.setPageNum(page.getPageNum());
        result.setPageSize(page.getPageSize());
        result.setTotal(page.getTotal());
        result.setTotalPage(page.getTotalPage());
        return result;
    }

    private List<SkuVo> parseSkuList(List<Sku> skuList) {
        List<SkuVo> list = new ArrayList<>();
        for (Sku sku : skuList) {
            SkuVo skuVo = new SkuVo();
            //将Sku实体中的数据复制到SkuVo中
            BeanUtils.copyProperties(sku, skuVo);
            list.add(skuVo);
        }
        return list;
    }

}
